package vf1.so;

/************************************************************************
  			VF1_SO_BFTCliente.java

    BattleField Tactics Online - A Strategy RPG Online Game
    Copyright (C) 2008  
	Douglas Ribeiro, Kely Marques Rosa, Rodrigo da Fonseca Lacerda

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.

	Contact: douglas666@gmail.com
 **************************************************************************/


import java.awt.DisplayMode;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.net.MalformedURLException;
import java.net.UnknownHostException;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.server.ExportException;
import java.rmi.server.ServerNotActiveException;
import java.util.*;

import javax.swing.JFrame;

import vf1.iu.*;
import vf1.rn.*;
import vf2.so.*;

/**
 * Class VF1_SO_BFTCliente
 */
public class VF1_SO_BFTCliente {

	//
	// Fields
	//
	private static VF2_SO_IServidorRMI rmi_servidor; // RMI
	//private static VF1_SO_Cliente cliente;
	private VF1_SO_ClienteRMI rmi_cliente;

	//DisplayMode displayMode = new DisplayMode(800, 600, 16,
	//DisplayMode.REFRESH_RATE_UNKNOWN); // adicionado
	private VF1_RN_Jogador jogador = new VF1_RN_Jogador();
	private String usuario;
	private String servidor;
	private VF1_IU_Inicio tela_inicio;
	private VF1_IU_Espera tela_espera = new VF1_IU_Espera();
	private VF1_IU_Batalha tela_batalha;
	private static final VF1_SO_BFTCliente cliente = new VF1_SO_BFTCliente();  // Singleton!

	//
	// Constructors
	//
	private VF1_SO_BFTCliente () {
		try {
			setClienteRMI(new VF1_SO_ClienteRMI());
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	};

	//
	// Methods
	//

	//
	// Accessor methods
	//

	/**
	 * Set the value of jogador
	 * @param newVar the new value of jogador
	 */
	public void setJogador ( VF1_RN_Jogador newVar ) {
		jogador = newVar;
	}

	/**
	 * Get the value of jogador
	 * @return the value of jogador
	 */
	public VF1_RN_Jogador getJogador ( ) {
		return jogador;
	}

	/**
	 * Set the value of usuario
	 * @param newVar the new value of usuario
	 */
	private void setUsuario ( String newVar ) {
		usuario = newVar;
	}

	/**
	 * Get the value of usuario
	 * @return the value of usuario
	 */
	private String getUsuario ( ) {
		return usuario;
	}

	/**
	 * Set the value of servidor
	 * @param newVar the new value of servidor
	 */
	private void setServidor ( String newVar ) {
		servidor = newVar;
	}

	/**
	 * Get the value of servidor
	 * @return the value of servidor
	 */
	private String getServidor ( ) {
		return servidor;
	}

	/**
	 * Set the value of tela_inicio
	 * @param newVar the new value of tela_inicio
	 */
	private void setTela_inicio ( VF1_IU_Inicio newVar ) {
		tela_inicio = newVar;
	}

	/**
	 * Get the value of tela_inicio
	 * @return the value of tela_inicio
	 */
	private VF1_IU_Inicio getTela_inicio ( ) {
		return tela_inicio;
	}

	/**
	 * Set the value of tela_espera
	 * @param newVar the new value of tela_espera
	 */
	private void setTela_espera ( VF1_IU_Espera newVar ) {
		tela_espera = newVar;
	}

	/**
	 * Get the value of tela_espera
	 * @return the value of tela_espera
	 */
	public VF1_IU_Espera getTela_espera ( ) {
		return tela_espera;
	}

	/**
	 * Set the value of tela_batalha
	 * @param newVar the new value of tela_batalha
	 */
	private void setTela_batalha ( VF1_IU_Batalha newVar ) {
		tela_batalha = newVar;
	}

	/**
	 * Get the value of tela_batalha
	 * @return the value of tela_batalha
	 */
	public VF1_IU_Batalha getTela_batalha ( ) {
		return tela_batalha;
	}

	/**
	 * Set the value of cliente
	 * @param newVar the new value of cliente
	 */
	/* private void setCliente ( VF1_SO_BFTCliente newVar ) {
      cliente = newVar;
  }*/

	/**
	 * Get the value of cliente
	 * @return the value of cliente
	 */
	public static VF1_SO_BFTCliente getCliente ( ) {   // Singleton!
		return cliente;
	}

	//
	// Other methods
	//

	/**
	 */
	public void iniciarTelaEspera(  )
	{
		//MA:
		//this.setTelaEspera(new VF1_IU_Espera());
		//tela_espera.apresentarTelaEspera();

		//this.setTela_espera(new VF1_IU_Espera());
		getTela_espera().apresentarTelaEspera();

	}


	/**
	 */
	public void iniciarTelaBatalha(List<String> nomes_jogadores)
	{
		//MA
		//this.setTela_batalha(new VF1_IU_Batalha());
		//tela_batalha.apresentarTelaBatalha();
		this.setTela_batalha(new VF1_IU_Batalha());
		getTela_batalha().apresentarTelaBatalha(nomes_jogadores);
	}


	/**
	 */
	public void desconectarDoServidor(  )
	{
		//MA:
		//usa o m�todo desconectarJogador(this.getUsuario()) 
		//do objeto de VF2_SO_BFTServidor criado pelo RMI;
		try {
			getRmi_servidor().desconectarJogador(jogador.getIp());
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}


	/**
	 */
	public void finalizarCliente(  )
	{
		desconectarDoServidor();
		getClienteRMI().finalizarClienteRMI();
		tela_batalha.getFrame().dispose();
		tela_espera.getFrame().dispose();
		//MA:
		//encerra aplicativo;

		//A ser implementado: finalizar conexão se houver e etc...
		/*	  JFrame frame = new JFrame();

	  screen.setFullScreen(getDisplayMode(), frame);
	  screen.restoreScreen();*/
	}


	/**
	 * @param        mensagem
	 */
	public void apresentarMensagem( String mensagem )
	{
		//MA:
		//cria uma janela de popup java;
		//imprime a mensagem na janela;

	}


	/**
	 * @return       int
	 * @throws RemoteException 
	 * @throws MalformedURLException 
	 * @throws UnknownHostException 
	 */
	public int iniciarCliente(  ) throws MalformedURLException, RemoteException, UnknownHostException
	{
		//MA:
		//this.setTelaInicio( new VF1_IU_Tela_Inicio() );
		//tela_inicio.apresentarTelaInicio();
		try {
			getClienteRMI().iniciarClienteRMI(true);
		} catch (ExportException e) {
			getClienteRMI().iniciarClienteRMI(false);
		} catch (UnknownHostException e) {
			e.printStackTrace();
		}
		this.setTela_inicio(new VF1_IU_Inicio());		
		tela_inicio.apresentarTelaInicio();

		return 1;
	}


	/**
	 * @return int
	 * @param usuario
	 * @param servidor
	 * @throws NotBoundException 
	 * @throws RemoteException 
	 * @throws MalformedURLException 
	 */
	public void conectarAoServidor( String usuario, String servidor ) throws MalformedURLException, RemoteException, NotBoundException
	{ //Douglas - Mudado para void

		//MA:
		//cria um objeto de VF2_SO_BFTServidor por RMI;
		//usa o metodo conectarJogador( usuario ) dele;

		getJogador().setNome(usuario);
		setRmi_servidor((vf2.so.VF2_SO_IServidorRMI) java.rmi.Naming.lookup(String.format("rmi://%s:6660//BattleFieldTactics", servidor)));
		//return 1;
		try {
			getRmi_servidor().conectarJogador(usuario);
		} catch (ServerNotActiveException e) {
			e.printStackTrace();
		}

	}

//	public DisplayMode getDisplayMode() {
//	return displayMode;
//	}

//	public void setDisplayMode(DisplayMode displayMode) {
//	this.displayMode = displayMode;
//	}

	public static VF2_SO_IServidorRMI getRmi_servidor() {
		return rmi_servidor;
	}

	public static void setRmi_servidor(VF2_SO_IServidorRMI rmi_servidor) {
		VF1_SO_BFTCliente.rmi_servidor = rmi_servidor;
	}

	public VF1_SO_ClienteRMI getClienteRMI() {
		return rmi_cliente;
	}

	public void setClienteRMI(VF1_SO_ClienteRMI rmi_cliente) {
		this.rmi_cliente = rmi_cliente;
	}



}
